#include "ti/driverlib/dl_uart_main.h"
#include "ti_msp_dl_config.h"

#define UART_RIS        (*(volatile uint32_t *)(UART0_BASE + 0x1030))//原始RX中断标志位寄存器
#define UART_STAT       (*(volatile uint32_t *)(UART0_BASE + 0x1108))//前面的*是解引用
#define UART_RIS_RX_MASK (1 << 10)  // 第 10 位是接收中断标志

// 检查接收中断标志（仅第 10 位）
bool UART_IsRxInterruptTriggered(void) {
    return (UART_RIS & UART_RIS_RX_MASK) != 0;//不为0是中断挂起，返回ture
}

bool UART_IsTxBusy(void) {//检查发送状态
    return (UART_STAT & 1) != 0;
}

uint8_t Serial_TxPacket[4];//设置两个接口的缓冲区，只存储有效字符，不包括包头包尾
uint8_t Serial_RxPacket[4];
uint8_t Serial_RxFlag;//设置一个标志位

void Serial_Init(void)
{
	NVIC_ClearPendingIRQ(UART0_INT_IRQn);//清除中断标志位
    NVIC_EnableIRQ(UART0_INT_IRQn);//使能中断
}

void UART0_IRQHandler(void)//状态机程序
{
	static uint8_t RxState = 0;//判断接收属于第几个状态
	static uint8_t pRxPacket = 0;
	if (UART_IsRxInterruptTriggered() == true)//查询标志位
	{
		uint8_t RxData = DL_UART_Main_receiveData(UART0);
		//可以添加判断代码，判断是否传输完毕再接着存储下一个字节
		if (RxState == 0)//0状态表示接收包头
		{
			if (RxData == 0xFF)
			{
				RxState = 1;
				pRxPacket = 0;//每次接收包头时存储位置置0
			}
		}
		else if (RxState == 1)//1状态表示接收有效数据
		{
			Serial_RxPacket[pRxPacket] = RxData;
			pRxPacket ++;//存储位置加1
			if (pRxPacket >= 4)//因为是固定包长，所以接收达到4就说明接收完毕
			{
				RxState = 2;
			}
		}
		else if (RxState == 2)//2状态表示接收包尾
		{
			if (RxData == 0xFE)
			{
				RxState = 0;//状态回归0
				Serial_RxFlag = 1;//标志位，标志接收完毕
			}
		}
		
		NVIC_ClearPendingIRQ(UART0_INT_IRQn);
	}
}

void Serial_SendByte(uint8_t byte)
{
    while (UART_IsTxBusy());
	DL_UART_Main_transmitData(UART0,byte);
}

void Serial_SendArray(uint8_t *Array,uint8_t length)
{
	for(uint8_t i=0;i<length;i++){
		Serial_SendByte(Array[i]);
	}
}

void Serial_SendPacket(void)//固定包长传输自动添加包头包尾
{
	Serial_SendByte(0xFF);
	Serial_SendArray(Serial_TxPacket,4);//注意这里发送数据长度根据需要更改
	Serial_SendByte(0xFE);
}

uint8_t Serial_GetRxFlag(void)//此函数用于判断数据是否接收完毕并且把标志位清零
{
	if(Serial_RxFlag == 1){
		Serial_RxFlag = 0;
		return 1;
	}
	return 0;
}

void Serial_SendString(uint8_t *string)
{
	for(uint8_t i;string[i] != '\0';i++)
	{
		Serial_SendByte(string[i]);//注意这里要用\r\n两个转义字符来控制换行
	}

}